package com.gitee.algorithm.sort;
/*
冒泡排序：将最小值往前冒泡,每次会找到一个最大值放到最后位置
{3,2,4,5,6,1}------->[1, 2, 3, 4, 5, 6]
先比较后交换一共是5,4,3,2,1趟
外层循环作用：控制5,4,3,2,1的趟数递减                       趟数。每趟找出最大值放到最后
内存循环作用：控制5次，4次，3次，2次，1次比较交换递减         次数。每趟中需要比较交换的次数

1相邻元素比较
2交换


 */

public class Bubble {

    /*
1.对数组内的元素进行排序
     */
    public static void sort(Comparable[] a){
        //韩顺平
        for (int i=a.length-1;i>0;i--){
            for(int j=0;j<i;j++){
                //比较j和j+1索引处的值
                if(greater(a[j],a[j+1])){
                    exch(a,j,j+1);
                }
            }
        }

        //圣月娥
//        boolean flag=false;
//        for(int i=0;i<a.length-1;i++){
//            for(int j=0;j<a.length-1-i;j++){
//                if (greater(a[j],a[j+1])){
//                    exch(a,j,j+1);
//                    flag=true;
//                }
//            }
//            if(!flag){
//                break;
//            }else {
//                flag=false;
//            }
//        }
        //冒泡排序的优化：给一个标识，如果有某一趟没有交换（已经有序）则跳出外层循环，不用进行下一趟循环了
    }

    /*
2.判断v是否大于w
     */
    private static boolean greater(Comparable v,Comparable w){
        return v.compareTo(w)>0;
    }


    /*
3.交换a数组中，索引i和索引j处的值
     */
    private static void exch(Comparable[] a,int i,int j){
        Comparable  temp=a[i];
        a[i]=a[j];
        a[j]=temp;

    }
}
